package com.Reactor3参考文档;

import org.junit.Test;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;

public class StepVerifierDemo {

	// 例如，你可能会使用如下的工具方法来包装一个 Flux
	private <T> Flux<T> appendBoomError(Flux<T> source) {
		return source.concatWith(Mono.error(new IllegalArgumentException("boom")));
	}

	@Test
	// 我希望这个 Flux 先发出 foo，然后发出 bar，然后 生成一个内容为 boom 的错误。 最后订阅并校验它们
	public void test() {
		// 由于被测试方法需要一个 Flux，定义一个简单的 Flux 用于测试
		Flux<String> source = Flux.just("foo", "bar");

		// 创建一个 StepVerifier 构造器来包装和校验一个 Flux
		StepVerifier.create(
				// 传进来需要测试的 Flux（即待测方法的返回结果）
				appendBoomError(source))
				// 第一个我们期望的信号是 onNext，它的值为 foo
				.expectNext("foo")
				.expectNext("bar")
				// 最后我们期望的是一个终止信号 onError，异常内容应该为 boom
				.expectErrorMessage("boom")
				// 不要忘了使用 verify() 触发测试
				.verify();
	}

}
